﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AvaliacaoOnline.Data;
using System.Data;

namespace AvaliacaoOnline.Model
{
    public class ClienteRepository
    {
        public List<Cliente> GetClientes()
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();
            return context.Cliente.ToList();
        }

        public Cliente GetCliente(int idCliente)
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();

            return context.Cliente.Where(c => c.Id == idCliente).FirstOrDefault();
        }

        public Cliente GetClientePorUrl(string urlCliente)
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();

            return context.Cliente.Where(c => c.Url == urlCliente).FirstOrDefault();
        }

        public void GravarCliente(Cliente cliente, ref string erros)
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();

            List<String> lstErros = ValidaCliente(cliente).ToList();
            if (lstErros.Count > 0)
            {
                foreach (string s in lstErros)
                    erros += s + Environment.NewLine;

                return;
            }

            if (cliente.Id == 0)
            {
                cliente.LogoImagem = String.Empty;
                context.Cliente.AddObject(cliente);
            }
            else
            {
                context.Cliente.Attach(cliente);
                context.ObjectStateManager.ChangeObjectState(cliente, EntityState.Modified);
            }
            context.SaveChanges();
        }

        public void ExcluirCliente(int idCliente, ref string erros)
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();

            if (context.Avaliacao
                .Where(c => c.IdCliente== idCliente).Count() > 0)
            {
                erros = "Este cliente possui avaliações associadas a ele.";
                return;
            }
            if (context.Usuario
                .Where(c => c.IdCliente == idCliente).Count() > 0)
            {
                erros = "Este cliente possui usuários associados a ele.";
                return;
            }

            context.DeleteObject(context.Cliente.Where(c => c.Id == idCliente).First());

            context.SaveChanges();
        }

        public void AtualizarImagemFundo(int idCliente, string logo)
        {
            AvaliacaoOnlineContext context = AvaliacaoOnlineContext.GetContext();
            Cliente cliente = context.Cliente.Where(c => c.Id == idCliente).FirstOrDefault();
            cliente.LogoImagem = logo;
            context.SaveChanges();
        }

        public IEnumerable<String> ValidaCliente(Cliente cliente)
        {
            if (String.IsNullOrWhiteSpace(cliente.Nome))
                yield return "O campo nome não pode ser vazio.";
        }
    }
}
